package main

import (
	"github.com/gin-contrib/sessions"
	"github.com/gin-contrib/sessions/cookie"
	"github.com/gin-gonic/gin"
	"net/http"
)

// 	使用	session 需要下载中间件：
//	go get github.com/gin-contrib/sessions
//	go get github.com/gin-contrib/sessions/cookie

// 当设置session的时候，会先在服务器保存一个session，然后生成一个键值对，把key下发到浏览器里面，
// 然后在浏览器生成一个cookie，下次访问服务时候，需要携带这个cookie才能找到对应的session

func main() {

	r := gin.Default()

	// 开始配置 session
	// 创建 cookie 的存储引擎，里面写上加密的密钥，也可以不写
	store := cookie.NewStore([]byte("加密的密钥"))
	// 配置 session 的中间件，也可以使用其他引擎进行配置，获取session 的时候，就是通过 mySession 这个key获取
	r.Use(sessions.Sessions("mySession", store))

	r.GET("/set", func(context *gin.Context) {
		// 设置 session
		session := sessions.Default(context) // 需要先拿到session实例
		session.Options(sessions.Options{
			MaxAge: 60 * 60 * 24, // 设置过期时间，单位 秒
		})
		session.Set("username", "张三")
		session.Save() // 需要调用保存函数

		context.JSON(http.StatusOK, gin.H{
			"method": "SUCCESS",
		})
	})
	// 调用了 http://localhost:8080/set  以后会发现浏览器上多了一个 key 为  mySession 的cookie
	// 只要有 mySession 这个 cookie，就可以获取到session

	r.GET("/get", func(context *gin.Context) {

		// 获取session
		session := sessions.Default(context) // 需要先拿到session实例
		username := session.Get("username")

		context.JSON(http.StatusOK, gin.H{
			"cookie": username,
		})
	})

	r.Run()
}
